package com.hanamaki.method;

/**
 * 递归
 * 方法调用本身方法（自己调用自己）
 *
 * A方法调用B方法
 * 递归：A调用A方法
 *
 * 递归分为两部分：
 * 1. 递归头：什么时候不在调用自己，如果没有递归头，死循环
 * 2. 递归体：什么时候需要调用自己的方法
 * 3. 只能够计算深度比较浅的运算
 */
public class Demo07 {

    /* 阶乘 !
    *  5!  5* 4 * 3 *2 * 1
    *  */


    public static void test() {
        test();
    }

    public static void main(String[] args) {

        /* 如果没有 结束标志 会死循环 StackOverflowError */
//        test();
        int f = f(15);
        System.out.println(f);

        int sum = sum(100);
        System.out.println(sum);

    }

    /**
     * 定义一个计算阶乘的方法
     * @param num
     * @return
     */
    public static int f(int num) {

        if (num == 1) {
            return 1;
        }else
        return num * f(num - 1);

    }


    /**
     * 定义一个递归方法 来计算  1+·····+100的和
     */
    public static int sum(int num) {
        if (num == 0) {
            return 0;
        } else {
            return num +sum(num - 1);
        }

    }


}
